<!doctype html>



  


<html class="theme-next mist use-motion">
<head>
  <meta charset="UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"/>



<meta http-equiv="Cache-Control" content="no-transform" />
<meta http-equiv="Cache-Control" content="no-siteapp" />












  <link href="/vendors/fancybox/source/jquery.fancybox.css?v=2.1.5" rel="stylesheet" type="text/css"/>




  <link href="//fonts.useso.com/css?family=Lato:300,400,700,400italic&subset=latin,latin-ext" rel="stylesheet" type="text/css">



<link href="/vendors/font-awesome/css/font-awesome.min.css?v=4.4.0" rel="stylesheet" type="text/css" />

<link href="/css/main.css?v=0.5.0" rel="stylesheet" type="text/css" />


  <meta name="keywords" content="Git,VCS," />





  <link rel="alternate" href="/atom.xml" title="Lippi-浮生志" type="application/atom+xml" />




  <link rel="shortcut icon" type="image/x-icon" href="/favicon.ico?v=0.5.0" />






<meta name="description" content="这篇文章主要介绍Git分布式版本管理与集中式管理的一些差异，总结下Git常用命令作为日后的速查表，最后介绍Git进阶的一些案例。本文分为以下几个部分：

Git与SVN差异
Git常用命令
Git进阶指南">
<meta property="og:type" content="article">
<meta property="og:title" content="Git操作手册|命令速查表">
<meta property="og:url" content="http://www.ezlippi.com/blog/2016/02/git-guide.html">
<meta property="og:site_name" content="Lippi-浮生志">
<meta property="og:description" content="这篇文章主要介绍Git分布式版本管理与集中式管理的一些差异，总结下Git常用命令作为日后的速查表，最后介绍Git进阶的一些案例。本文分为以下几个部分：

Git与SVN差异
Git常用命令
Git进阶指南">
<meta property="og:image" content="http://www.ezlippi.com/images/images/git.gif">
<meta property="og:image" content="http://www.ezlippi.com/images/images/svn.png">
<meta property="og:image" content="http://www.ezlippi.com/images/images/gitgit.png">
<meta property="og:updated_time" content="2016-02-29T12:30:22.000Z">
<meta name="twitter:card" content="summary">
<meta name="twitter:title" content="Git操作手册|命令速查表">
<meta name="twitter:description" content="这篇文章主要介绍Git分布式版本管理与集中式管理的一些差异，总结下Git常用命令作为日后的速查表，最后介绍Git进阶的一些案例。本文分为以下几个部分：

Git与SVN差异
Git常用命令
Git进阶指南">



<script type="text/javascript" id="hexo.configuration">
  var NexT = window.NexT || {};
  var CONFIG = {
    scheme: 'Mist',
    sidebar: {"position":"left","display":"post"},
    fancybox: true,
    motion: true,
    duoshuo: {
      userId: 0,
      author: '博主'
    }
  };
</script>

  <title> Git操作手册|命令速查表 | Lippi-浮生志 </title>
</head>

<body itemscope itemtype="http://schema.org/WebPage" lang="zh-Hans">

  



  <script type="text/javascript">
    var _hmt = _hmt || [];
    (function() {
      var hm = document.createElement("script");
      hm.src = "//hm.baidu.com/hm.js?340874ba9357cbe81570aa4ac1185941";
      var s = document.getElementsByTagName("script")[0];
      s.parentNode.insertBefore(hm, s);
    })();
  </script>






  
  
    
  

  <div class="container one-collumn sidebar-position-left page-post-detail ">
    <div class="headband"></div>

    <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader">
      <div class="header-inner">
<script>
(function(){
    var bp = document.createElement('script');
    bp.src = '//push.zhanzhang.baidu.com/push.js';
    var s = document.getElementsByTagName("script")[0];
    s.parentNode.insertBefore(bp, s);
})();
</script>
            
<div class="site-meta ">
  

  <div class="custom-logo-site-title">
    <a href="/"  class="brand" rel="start">
      <span class="logo-line-before"><i></i></span>
      <span class="site-title">Lippi-浮生志</span>
      <span class="logo-line-after"><i></i></span>
    </a>
  </div>
  <p class="site-subtitle"></p>
</div>

<div class="site-nav-toggle">
  <button>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
    <span class="btn-bar"></span>
  </button>
</div>

<nav class="site-nav">
  

  
    <ul id="menu" class="menu menu-left">
      
        
        <li class="menu-item menu-item-home">
          <a href="/" rel="section">
            
              <i class="menu-item-icon fa fa-home fa-fw"></i> <br />
            
            首页
          </a>
        </li>
      
        
        <li class="menu-item menu-item-categories">
          <a href="/categories" rel="section">
            
              <i class="menu-item-icon fa fa-th fa-fw"></i> <br />
            
            分类
          </a>
        </li>
      
        
        <li class="menu-item menu-item-archives">
          <a href="/archives" rel="section">
            
              <i class="menu-item-icon fa fa-archive fa-fw"></i> <br />
            
            归档
          </a>
        </li>
      
        
        <li class="menu-item menu-item-tags">
          <a href="/tags" rel="section">
            
              <i class="menu-item-icon fa fa-tags fa-fw"></i> <br />
            
            标签
          </a>
        </li>
      
        
        <li class="menu-item menu-item-about">
          <a href="/about" rel="section">
            
              <i class="menu-item-icon fa fa-user fa-fw"></i> <br />
            
            关于
          </a>
        </li>
      

      
      
      
    </ul>
  

  
    <div class="site-search">
      
  <form class="site-search-form">
  <input type="text" id="st-search-input" class="st-search-input st-default-search-input" />
</form>

<script type="text/javascript">
  (function(w,d,t,u,n,s,e){w['SwiftypeObject']=n;w[n]=w[n]||function(){
    (w[n].q=w[n].q||[]).push(arguments);};s=d.createElement(t);
    e=d.getElementsByTagName(t)[0];s.async=1;s.src=u;e.parentNode.insertBefore(s,e);
  })(window,document,'script','//s.swiftypecdn.com/install/v2/st.js','_st');

  _st('install', 'fLM9qfxyerC6njvM7usy','2.0.0');
</script>



    </div>
  
</nav>

 </div>
    </header>

    <main id="main" class="main">
      <div class="main-inner">
        <div class="content-wrap">
          <div id="content" class="content">
            

  <div id="posts" class="posts-expand">
    

  
  

  
  
  

  <article class="post post-type-normal " itemscope itemtype="http://schema.org/Article">

    
      <header class="post-header">

        
        
          <h1 class="post-title" itemprop="name headline">
            
            
              
                Git操作手册|命令速查表
              
            
          </h1>
        

        <div class="post-meta">
          <span class="post-time">
            <span class="post-meta-item-icon">
              <i class="fa fa-calendar-o"></i>
            </span>
            <span class="post-meta-item-text">发表于</span>
            <time itemprop="dateCreated" datetime="2016-02-20T00:00:00+08:00" content="2016-02-20">
              2016-02-20
            </time>
          </span>

          
            <span class="post-category" >
              &nbsp; | &nbsp;
              <span class="post-meta-item-icon">
                <i class="fa fa-folder-o"></i>
              </span>
              <span class="post-meta-item-text">分类于</span>
              
                <span itemprop="about" itemscope itemtype="https://schema.org/Thing">
                  <a href="/categories/Git/" itemprop="url" rel="index">
                    <span itemprop="name">Git</span>
                  </a>
                </span>

                
                

              
            </span>
          

          
            
              <span class="post-comments-count">
                &nbsp; | &nbsp;
                <a href="/blog/2016/02/git-guide.html#comments" itemprop="discussionUrl">
                  <span class="post-comments-count ds-thread-count" data-thread-key="/blog/2016/02/git-guide.html" itemprop="commentsCount"></span>
                </a>
              </span>
            
          

          

          
          
	
	<span id="busuanzi_container_page_pv" class="post-meta-item-text">
		&nbsp; | &nbsp;  
	    <span id="busuanzi_value_page_pv"><i class="fa fa-spinner fa-spin"></i></span> Hits
	</span>
        </div>
      </header>
    
	


    <div class="post-body" itemprop="articleBody">

      
      

      
        <p>这篇文章主要介绍Git分布式版本管理与集中式管理的一些差异，总结下Git常用命令作为日后的速查表，最后介绍Git进阶的一些案例。<br>本文分为以下几个部分：</p>
<ol>
<li>Git与SVN差异</li>
<li>Git常用命令</li>
<li>Git进阶指南</li>
</ol>
<a id="more"></a>
<h2 id="Git与SVN差异"><a href="#Git与SVN差异" class="headerlink" title="Git与SVN差异"></a>Git与SVN差异</h2><p>Git的第一个版本是Linux之父Linus Torvalds亲手操刀设计和实现的,Git 基于 DAG 结构 (Directed Acyclic Graph)，其运行起来相当的快,它已经是现在的主流。</p>
<p>Git 和 SVN 思想最大的差别有四个：</p>
<ul>
<li>去中心化</li>
<li>直接记录快照，而非差异</li>
<li>不一样的分支概念</li>
<li>三个文件状态</li>
</ul>
<p><strong>去中心化</strong></p>
<p>Git是一个DVCS（分布式版本管理系统），在技术层面上并不存在一个像中心仓库这样的东西 ， 所有的数据都在本地，不存在谁是中心</p>
<p><img src="/images/images/git.gif" alt=""></p>
<p>图中每个开发者拉取(pull)并推送(push)到origin。但除了这种集中式的推送拉取关系，每个开发者也可能会从其他的开发者处拉取代码的变更，从技术上讲，这意味着Alice定义了一个名为bob的Git的remote，它指向了Bob的软件仓库。反之亦然。</p>
<p><strong>直接记录快照，而非差异</strong></p>
<p>Git每一个版本都是直接记录快照，而非文件的差异。 下面两个对比图在网上是广为流传大家应该熟悉：</p>
<p>SVN：</p>
<p><img src="/images/images/svn.png" alt=""></p>
<p>Git:</p>
<p><img src="/images/images/gitgit.png" alt=""></p>
<p>Git使用SHA-1算法计算数据的校验和，通过文件的内容或目录计算出SHA-1哈希值，作为指纹字符串，每个Version 都是一个快照。</p>
<p><strong>不一样的分支概念</strong></p>
<p>Git的分支本质是一个指向提交快照的指针，是从某个提交快照往回看的历史。当创建/切换分支的时候，只是变换了指针指向而已.而SVN创建一个分支， 是的的确确的复制了一份文件。</p>
<p><strong>三个文件状态</strong></p>
<p>在Git中文件有三种状态：</p>
<ul>
<li>已提交（committed）：该文件被安全地保存在了本地数据库</li>
<li>已修改（modified）：修改了某个文件，但还没有保存</li>
<li>已暂存（staged）：把已修改的文件放下下次保存的清单中</li>
</ul>
<h2 id="Git常用命令"><a href="#Git常用命令" class="headerlink" title="Git常用命令"></a>Git常用命令</h2><h2 id="创建"><a href="#创建" class="headerlink" title="创建"></a>创建</h2><p>复制一个已创建的仓库:</p>
<pre><code>$ git clone ssh://user@domain.com/repo.git
</code></pre><p>创建一个新的本地仓库:</p>
<pre><code>$ git init
</code></pre><h2 id="本地修改"><a href="#本地修改" class="headerlink" title="本地修改"></a>本地修改</h2><p>显示工作路径下已修改的文件：</p>
<pre><code>$ git status
</code></pre><p>显示与上次提交版本文件的不同：</p>
<pre><code>$ git diff
</code></pre><p>把当前所有修改添加到下次提交中：</p>
<pre><code>$ git add
</code></pre><p>把对某个文件的修改添加到下次提交中：</p>
<pre><code>$ git add -p &lt;file&gt;
</code></pre><p>提交本地的所有修改：</p>
<pre><code>$ git commit -a
</code></pre><p>提交之前已标记的变化：</p>
<pre><code>$ git commit
</code></pre><p>附加消息提交：</p>
<pre><code>$ git commit -m &apos;message here&apos;
</code></pre><p>提交，并将提交时间设置为之前的某个日期:</p>
<pre><code>git commit --date=&quot;`date --date=&apos;n day ago&apos;`&quot; -am &quot;Commit Message&quot;
</code></pre><h2 id="修改上次提交"><a href="#修改上次提交" class="headerlink" title="修改上次提交"></a>修改上次提交</h2><p>请勿修改已发布的提交记录!</p>
<pre><code>$ git commit --amend
</code></pre><p>把当前分支中未提交的修改移动到其他分支</p>
<pre><code>git stash
git checkout branch2
git stash pop
</code></pre><h2 id="搜索"><a href="#搜索" class="headerlink" title="搜索"></a>搜索</h2><p>从当前目录的所有文件中查找文本内容：</p>
<pre><code>$ git grep &quot;Hello&quot;
</code></pre><p>在某一版本中搜索文本：</p>
<pre><code>$ git grep &quot;Hello&quot; v2.5
</code></pre><h2 id="提交历史"><a href="#提交历史" class="headerlink" title="提交历史"></a>提交历史</h2><p>从最新提交开始，显示所有的提交记录（显示hash， 作者信息，提交的标题和时间）：</p>
<pre><code>$ git log
</code></pre><p>显示所有提交（仅显示提交的hash和message）：</p>
<pre><code>$ git log --oneline
</code></pre><p>显示某个用户的所有提交：</p>
<pre><code>$ git log --author=&quot;username&quot;
</code></pre><p>显示某个文件的所有修改：</p>
<pre><code>$ git log -p &lt;file&gt;
</code></pre><p>谁，在什么时间，修改了文件的什么内容：</p>
<pre><code>$ git blame &lt;file&gt;
</code></pre><h2 id="分支与标签"><a href="#分支与标签" class="headerlink" title="分支与标签"></a>分支与标签</h2><p>列出所有的分支：</p>
<pre><code>$ git branch
</code></pre><p>切换分支：</p>
<pre><code>$ git checkout &lt;branch&gt;
</code></pre><p>创建并切换到新分支:</p>
<pre><code>$ git checkout -b &lt;branch&gt;
</code></pre><p>基于当前分支创建新分支：</p>
<pre><code>$ git branch &lt;new-branch&gt;
</code></pre><p>基于远程分支创建新的可追溯的分支：</p>
<pre><code>$ git branch --track &lt;new-branch&gt; &lt;remote-branch&gt;
</code></pre><p>删除本地分支:</p>
<pre><code>$ git branch -d &lt;branch&gt;
</code></pre><p>给当前版本打标签：</p>
<pre><code>$ git tag &lt;tag-name&gt;
</code></pre><h2 id="更新与发布"><a href="#更新与发布" class="headerlink" title="更新与发布"></a>更新与发布</h2><p>列出当前配置的远程端：</p>
<pre><code>$ git remote -v
</code></pre><p>显示远程端的信息：</p>
<pre><code>$ git remote show &lt;remote&gt;
</code></pre><p>添加新的远程端：</p>
<pre><code>$ git remote add &lt;remote&gt; &lt;url&gt;
</code></pre><p>下载远程端版本，但不合并到HEAD中：</p>
<pre><code>$ git fetch &lt;remote&gt;
</code></pre><p>下载远程端版本，并自动与HEAD版本合并：</p>
<pre><code>$ git remote pull &lt;remote&gt; &lt;url&gt;
</code></pre><p>将远程端版本合并到本地版本中：</p>
<pre><code>$ git pull origin master
</code></pre><p>将本地版本发布到远程端：</p>
<pre><code>$ git push remote &lt;remote&gt; &lt;branch&gt;
</code></pre><p>删除远程端分支：</p>
<pre><code>$ git push &lt;remote&gt; :&lt;branch&gt; (since Git v1.5.0)
或
git push &lt;remote&gt; --delete &lt;branch&gt; (since Git v1.7.0)
</code></pre><p>发布标签:</p>
<pre><code>$ git push --tags
</code></pre><h2 id="合并与重置"><a href="#合并与重置" class="headerlink" title="合并与重置"></a>合并与重置</h2><p>将分支合并到当前HEAD中：</p>
<pre><code>$ git merge &lt;branch&gt;
</code></pre><p>将当前HEAD版本重置到分支中:<br>请勿重置已发布的提交!</p>
<pre><code>$ git rebase &lt;branch&gt;
</code></pre><p>退出重置:</p>
<pre><code>$ git rebase --abort
</code></pre><p>解决冲突后继续重置：</p>
<pre><code>$ git rebase --continue
</code></pre><p>使用配置好的merge tool 解决冲突：</p>
<pre><code>$ git mergetool
</code></pre><p>在编辑器中手动解决冲突后，标记文件为已解决冲突</p>
<pre><code>$ git add &lt;resolved-file&gt;
$ git rm &lt;resolved-file&gt;
</code></pre><h2 id="撤销"><a href="#撤销" class="headerlink" title="撤销"></a>撤销</h2><p>放弃工作目录下的所有修改：</p>
<pre><code>$ git reset --hard HEAD
</code></pre><p>移除缓存区的所有文件（i.e. 撤销上次git add）:</p>
<pre><code>$ git reset HEAD
</code></pre><p>放弃某个文件的所有本地修改：</p>
<pre><code>$ git checkout HEAD &lt;file&gt;
</code></pre><p>重置一个提交（通过创建一个截然不同的新提交）</p>
<pre><code>$ git revert &lt;commit&gt;
</code></pre><p>将HEAD重置到指定的版本，并抛弃该版本之后的所有修改：</p>
<pre><code>$ git reset --hard &lt;commit&gt;
</code></pre><p>将HEAD重置到上一次提交的版本，并将之后的修改标记为未添加到缓存区的修改：</p>
<pre><code>$ git reset &lt;commit&gt;
</code></pre><p>将HEAD重置到上一次提交的版本，并保留未提交的本地修改：</p>
<pre><code>$ git reset --keep &lt;commit&gt;
</code></pre><h2 id="Git进阶指南"><a href="#Git进阶指南" class="headerlink" title="Git进阶指南"></a>Git进阶指南</h2><h2 id="问：如何修改-origin-仓库信息？"><a href="#问：如何修改-origin-仓库信息？" class="headerlink" title="问：如何修改 origin 仓库信息？"></a>问：如何修改 origin 仓库信息？</h2><h3 id="1、添加-origin-仓库信息"><a href="#1、添加-origin-仓库信息" class="headerlink" title="1、添加 origin 仓库信息"></a>1、添加 origin 仓库信息</h3><pre><code>git remote add origin &lt;git仓库地址&gt;
</code></pre><h3 id="2、查看-origin-仓库信息"><a href="#2、查看-origin-仓库信息" class="headerlink" title="2、查看 origin 仓库信息"></a>2、查看 origin 仓库信息</h3><pre><code>#以下三种方式均可
git config get --remote.origin.url
git remote -v
git remote show origin
</code></pre><h3 id="3、删除-origin-仓库信息"><a href="#3、删除-origin-仓库信息" class="headerlink" title="3、删除 origin 仓库信息"></a>3、删除 origin 仓库信息</h3><pre><code>git remote rm origin
</code></pre><h2 id="问：如何配置-git-ssh-keys-？"><a href="#问：如何配置-git-ssh-keys-？" class="headerlink" title="问：如何配置 git ssh keys ？"></a>问：如何配置 git ssh keys ？</h2><p>在本地生成 ssh 私钥 / 公钥 文件<br>将「公钥」添加到 git 服务（github、gitlab、coding.net 等）网站后台<br>测试 git ssh 连接是否成功<br>接下来以添加 github ssh keys 为例，请注意替换 github 文件名。</p>
<p>注：如果对密钥机制不熟悉，建议不要指定 -f 参数，直接使用默认的 id_rsa 文件名。</p>
<pre><code>#运行以下命令，一直回车，文件名可随意指定
ssh-keygen -t rsa -b 4096 -C &quot;kaiye@macbook&quot; -f ~/.ssh/github

#如果不是默认密钥 id_rsa ，则需要以下命令注册密钥文件，-K 参数将密钥存入 Mac Keychain
ssh-add -K ~/.ssh/github

#将 pub 公钥的内容粘贴到线上网站的后台
cat ~/.ssh/github.pub

#测试 git ssh 是否连接成功
ssh -T git@github.com
</code></pre><h2 id="问：如何撤销修改？"><a href="#问：如何撤销修改？" class="headerlink" title="问：如何撤销修改？"></a>问：如何撤销修改？</h2><p>  修改包含四种情况，需单独区分。</p>
<h3 id="1、新建的文件和目录，且从未提交至版本库"><a href="#1、新建的文件和目录，且从未提交至版本库" class="headerlink" title="1、新建的文件和目录，且从未提交至版本库"></a>1、新建的文件和目录，且从未提交至版本库</h3><p>  此类文件的状态为 Untracked files ，撤销方法如下：</p>
<pre><code>git clean -fd .
</code></pre><p>其中，. 表示当前目录及所有子目录中的文件，也可以直接指定对应的文件路径，以下其他情况类似。</p>
<h3 id="2、提交过版本库，但未提交至暂存区的文件（未执行-git-add）"><a href="#2、提交过版本库，但未提交至暂存区的文件（未执行-git-add）" class="headerlink" title="2、提交过版本库，但未提交至暂存区的文件（未执行 git add）"></a>2、提交过版本库，但未提交至暂存区的文件（未执行 git add）</h3><p>  此类文件的状态为<code>Changes not staged for commit</code>，撤销方法：</p>
<pre><code>git checkout .
</code></pre><h3 id="3、已提交至暂存区的文件"><a href="#3、已提交至暂存区的文件" class="headerlink" title="3、已提交至暂存区的文件"></a>3、已提交至暂存区的文件</h3><p>  此类文件的状态为 Changes to be committed，撤销方法：</p>
<pre><code>git reset .
</code></pre><p>执行之后文件将会回到以上的 1 或者 2 状态，可继续按以上步骤执行撤销，若 git reset 同时加上 –hard 参数，将会把修改过的文件也还原成版本库中的版本。</p>
<h3 id="4、已提交至版本库（执行了-git-commit）"><a href="#4、已提交至版本库（执行了-git-commit）" class="headerlink" title="4、已提交至版本库（执行了 git commit）"></a>4、已提交至版本库（执行了 git commit）</h3><p>  每次提交都会生成一个 hash 版本号，通过以下命令可查阅版本号并将其回滚：</p>
<pre><code>git log
git reset &lt;版本号&gt;
</code></pre><p>如果需要「回滚至上一次提交」，可直接使用以下命令：</p>
<pre><code>git reset head~1
</code></pre><p>执行之后，再按照 1 或者 2 状态进行处理即可，如果回滚之后的代码同时需要提交至 origin 仓库（即回滚 origin 线上仓库的代码），需要使用 -f 强制提交参数，且当前用户需要具备「强制提交的权限」。</p>
<h3 id="5、如果回滚了之后又不想回滚了怎么办？"><a href="#5、如果回滚了之后又不想回滚了怎么办？" class="headerlink" title="5、如果回滚了之后又不想回滚了怎么办？"></a>5、如果回滚了之后又不想回滚了怎么办？</h3><p>  如果是以上的情况 1 或者 2，只能歇屁了，因为修改没入过版本库，无法回滚。</p>
<p>  如果是情况 4，回滚之后通过 git log 将看不到回滚之前的版本号，但可通过 git reflog 命令（所有使用过的版本号）找到回滚之前的版本号，然后 git reset &lt;版本号&gt; 。</p>
<h2 id="问：遇到冲突了怎么解决？"><a href="#问：遇到冲突了怎么解决？" class="headerlink" title="问：遇到冲突了怎么解决？"></a>问：遇到冲突了怎么解决？</h2><p>  两个分支进行合并时（通常是 git pull 时），可能会遇到冲突，同时被修改的文件会进入 Unmerged 状态，需要解决冲突。</p>
<h3 id="1、最快的办法"><a href="#1、最快的办法" class="headerlink" title="1、最快的办法"></a>1、最快的办法</h3><p>  大部分时候，「最快解决冲突」的办法是：使用当前 HEAD 的版本（ours），或使用合并进来的分支版本（theirs）。</p>
<pre><code># 使用当前分支 HEAD 版本，通常是冲突源文件的 &lt;&lt;&lt;&lt;&lt;&lt;&lt; 标记部分，======= 的上方
git checkout --ours &lt;文件名&gt;

 # 使用合并分支版本，通常是源冲突文件的 &gt;&gt;&gt;&gt;&gt;&gt;&gt; 标记部分
 git checkout --theirs &lt;文件名&gt;

# 标记为解决状态加入暂存区
git add &lt;文件名&gt;
</code></pre><h3 id="2、最通用的办法"><a href="#2、最通用的办法" class="headerlink" title="2、最通用的办法"></a>2、最通用的办法</h3><p>  用编辑器打开冲突的源文件进行修改，可能会发生遗留，且体验不好，通常需要借助 git mergetool 命令。</p>
<p>  在 Mac 系统下，运行 git mergetool &lt;文件名&gt; 可以开启配置的第三方工具进行 merge，默认的是 FileMerge 应用程序，还可以配置成 Meld 或 kdiff3，体验更佳。</p>
<h3 id="3、最好的习惯"><a href="#3、最好的习惯" class="headerlink" title="3、最好的习惯"></a>3、最好的习惯</h3><p>  有三个好的习惯，可以减少代码的冲突：<br> 在开始修改代码前先 git pull 一下；<br>  将业务代码进行划分，尽量不要多个人在同一时间段修改同一文件；<br>  通过Gitflow 工作流也可以提升 git流程效率，减少发生冲突的可能性。</p>
<h3 id="4、最复杂的情况"><a href="#4、最复杂的情况" class="headerlink" title="4、最复杂的情况"></a>4、最复杂的情况</h3><p>  如果你的项目周期比较长，还应该养成「定期 rebase 的习惯」，git pull –rebase 可以让分支的代码和 origin 仓库的代码保持兼容，同时还不会破坏线上代码的可靠性。</p>
<p>  它的大概原理是，先将 origin 仓库的代码按 origin 的时间流在本地分支中提交，再将本地分支的修改记录追加到 origin 分支上。如果发生冲突，则可以即时的发现问题并解决，否则到项目上线时再解决冲突，可能会发生额外的风险。</p>
<p>  rebase 大概的操作步骤如下：</p>
<pre><code># 将当前分支的版本追加到从远程 pull 回来的节点之后
git pull --rebase

# 若发生冲突，则按以上其他方法进行解决，解决后继续
git rebase --continue

# 直到所有冲突得以解决，待项目最后上线前再执行
git push origin

# 若多次提交修改了同一文件，可能需要直接跳过后续提交，按提示操作即可
git rebase --skip
</code></pre><h2 id="问：如何在不提交修改的前提下，执行-pull-merge-等操作？"><a href="#问：如何在不提交修改的前提下，执行-pull-merge-等操作？" class="headerlink" title="问：如何在不提交修改的前提下，执行 pull / merge 等操作？"></a>问：如何在不提交修改的前提下，执行 pull / merge 等操作？</h2><p>  有些修改没有完全完成之前，可能不需要提交到版本库，圡方法是将修改的文件 copy 到 git 仓库之外的目录临时存放，pull / merge 操作完成之后，再 copy 回来。</p>
<p>  这样的做法一个是效率不高，另外一个可能会遗漏潜在的冲突。此类需求最好是通过 git stash 命令来完成，它可以将当前工作状态（WIP，work in progress）临时存放在 stash 队列中，待操作完成后再从 stash 队列中重新应用这些修改。</p>
<p>  以下是 git stash 常用命令：</p>
<pre><code># 查看 stash 队列中已暂存了多少 WIP
git stash list

# 恢复上一次的 WIP 状态，并从队列中移除
git stash pop

# 添加当前 WIP，注意：未提交到版本库的文件会自动忽略，只要不运行 git clean -fd . 就不会丢失
git stash

# 恢复指定编号的 WIP，同时从队列中移除
git stash pop stash@{num}

# 恢复指定编号的 WIP，但不从队列中移除
git stash apply stash@{num}
</code></pre><h2 id="问：如何在-git-log-中查看修改的文件列表？"><a href="#问：如何在-git-log-中查看修改的文件列表？" class="headerlink" title="问：如何在 git log 中查看修改的文件列表？"></a>问：如何在 git log 中查看修改的文件列表？</h2><p>  默认的 git log 会显示较全的信息，且不包含文件列表。使用 –name-status 可以看到修改的文件列表，使用 –oneline 可以将参数简化成一行。</p>
<pre><code>git log --name-status --oneline
</code></pre><p>  每次手动加上参数很麻烦，可以通过自定义快捷命令的方式来简化操作：</p>
<pre><code>git config --global alias.ls &apos;log --name-status --oneline --graph&apos;
</code></pre><p>  运行以上配置后，可通过 git ls 命令来实现「自定义 git log」效果，通过该方法也可以创建 git st 、 git ci 等一系列命令，以便沿用 svn 命令行习惯。</p>
<pre><code>git config --global alias.st &apos;status --porcelain&apos;
</code></pre><p>  更多 git log 参数，可通过 git help log 查看手册。</p>
<p>  如果是看上一次提交的版本日志，直接运行 git show 即可。</p>
<p>  此外，如果你的 Mac 安装了zsh（参考《全新Mac安装指南（编程篇），那么可以直接使用 gst、glog 等一系列快捷命令，详情见此列表：Plugin:git 。</p>
<h2 id="问：git-submodule-update-时出错怎么解决？"><a href="#问：git-submodule-update-时出错怎么解决？" class="headerlink" title="问：git submodule update 时出错怎么解决？"></a>问：git submodule update 时出错怎么解决？</h2><p>  例如，在执行 git submodule update 时有以下错误信息：</p>
<blockquote>
<p>fatal: reference is not a tree: f869da471c5d8a185cd110bbe4842d6757b002f5<br>Unable to checkout ‘f869da471c5d8a185cd110bbe4842d6757b002f5’ in submodule path ‘source/i18n-php-server’</p>
</blockquote>
<p>  在此例中，发生以上错误是因为 i18n-php-server 子仓库在某电脑 A 的「本地」commit 了新的版本 「f869da471c5d8a185cd110bbe4842d6757b002f5」，且该次 commit 未 push origin。但其父级仓库 i18n-www 中引用了该子仓库的版本号，且将引用记录 push origin，导致其他客户机无法 update 。</p>
<p>  解决方法，在电脑 A 上将 i18n-php-server 版本库 push origin 后，在其他客户机上执行 git submodule update 。或者用以上提到的 git reset 方法，将子仓库的引用版本号还原成 origin 上存在的最新版本号。</p>
<h2 id="其他问题"><a href="#其他问题" class="headerlink" title="其他问题"></a>其他问题</h2><p>  设置本地分支与远程分支保持同步，在第一次 git push 的时候带上 -u 参数即可</p>
<pre><code>git push origin master -u 
</code></pre><p>  支持中文目录与文件名的显示（git 默认将非 ASCII 编码的目录与文件名以八进制编码展示）</p>
<pre><code>git config core.quotepath off
</code></pre><p>  常用的打 tag 操作，更多请查看《Git 基础 - 打标签》</p>
<pre><code># 列出所有本地 tag
git tag   

# 本地新增一个 tag，推送至 origin 服务器
git tag -a v1.0.0 -m &apos;tag description&apos;
git push origin v1.0.0

# 删除本地与 origin tag
git tag -d v1.0.0
git push origin --delete v1.0.0
</code></pre><p>  使用 git GUI 客户端（如，SoureTree、Github Desktop）能极大的提升分支管理效率。分支合并操作通常只有两种情况：从 origin merge 到本地，使用 git pull 即可；从另外一个本地分支 merge 到当前分支，使用 git merge &lt;分支名&gt;，以下是常用命令：</p>
<pre><code># 新建分支 branch1，并切换过去
git checkout -b branch1

# 查看所有本地与远程分支
git branch -a

# 修改完成后，切换回 master 分支，将 branch1 分支合并进来
git checkout master
git merge branch1

# 删除已完成合并的分支 branch1
git branch -d branch1
</code></pre><h2 id="参考资料"><a href="#参考资料" class="headerlink" title="参考资料"></a>参考资料</h2><ol>
<li>Pro Git 简体中文版</li>
<li>Git权威指南</li>
<li>命令行man手册</li>
</ol>

      
    </div>

    <footer class="post-footer">
      
        <div class="post-tags">
          
            <a href="/tags/Git/" rel="tag">#Git</a>
          
            <a href="/tags/VCS/" rel="tag">#VCS</a>
          
        </div>
      

      
        <div class="post-nav">
          <div class="post-nav-next post-nav-item">
            
              <a href="/blog/2016/02/baidu-spider-forbidden.html" rel="next" title="解决百度爬虫无法抓取github pages">
                <i class="fa fa-chevron-left"></i> 解决百度爬虫无法抓取github pages
              </a>
            
          </div>

          <div class="post-nav-prev post-nav-item">
            
              <a href="/blog/2016/02/jekyll-to-hexo.html" rel="prev" title="Jekyll迁移到Hexo搭建个人博客">
                Jekyll迁移到Hexo搭建个人博客 <i class="fa fa-chevron-right"></i>
              </a>
            
          </div>
        </div>
      

      
      
    </footer>
  </article>



    <div class="post-spread">
      
        <div class="ds-share flat" data-thread-key="/blog/2016/02/git-guide.html"
     data-title="Git操作手册|命令速查表"
     data-content=""
     data-url="http://www.ezlippi.com//blog/2016/02/git-guide.html">
  <div class="ds-share-inline">
    <ul  class="ds-share-icons-16">

      <li data-toggle="ds-share-icons-more"><a class="ds-more" href="javascript:void(0);">分享到：</a></li>
      <li><a class="ds-weibo" href="javascript:void(0);" data-service="weibo">微博</a></li>
      <li><a class="ds-qzone" href="javascript:void(0);" data-service="qzone">QQ空间</a></li>
      <li><a class="ds-qqt" href="javascript:void(0);" data-service="qqt">腾讯微博</a></li>
      <li><a class="ds-wechat" href="javascript:void(0);" data-service="wechat">微信</a></li>

    </ul>
    <div class="ds-share-icons-more">
    </div>
  </div>
</div>
      
    </div>
  </div>


          </div>
          

  <p>热评文章</p>
  <div class="ds-top-threads" data-range="weekly" data-num-items="4"></div>


          
  <div class="comments" id="comments">
    
      <div class="ds-thread" data-thread-key="/blog/2016/02/git-guide.html"
           data-title="Git操作手册|命令速查表" data-url="http://www.ezlippi.com//blog/2016/02/git-guide.html">
      </div>
    
  </div>


        </div>
        
          
  
  <div class="sidebar-toggle">
    <div class="sidebar-toggle-line-wrap">
      <span class="sidebar-toggle-line sidebar-toggle-line-first"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span>
      <span class="sidebar-toggle-line sidebar-toggle-line-last"></span>
    </div>
  </div>

  <aside id="sidebar" class="sidebar">
    <div class="sidebar-inner">

      

      
        <ul class="sidebar-nav motion-element">
          <li class="sidebar-nav-toc sidebar-nav-active" data-target="post-toc-wrap" >
            文章目录
          </li>
          <li class="sidebar-nav-overview" data-target="site-overview">
            站点概览
          </li>
        </ul>
      

      <section class="site-overview sidebar-panel ">
        <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person">
          <img class="site-author-image" itemprop="image"
               src="/images/avatar.jpg"
               alt="EZLippi" />
          <p class="site-author-name" itemprop="name">EZLippi</p>
          <p class="site-description motion-element" itemprop="description">Easy Lippi</p>
        </div>
        <nav class="site-state motion-element">
          <div class="site-state-item site-state-posts">
            <a href="/archives">
              <span class="site-state-item-count">63</span>
              <span class="site-state-item-name">日志</span>
            </a>
          </div>
          
          
            <div class="site-state-item site-state-categories">
              <a href="/categories">
                <span class="site-state-item-count">22</span>
                <span class="site-state-item-name">分类</span>
              </a>
            </div>
          

          
            <div class="site-state-item site-state-tags">
              <a href="/tags">
                <span class="site-state-item-count">69</span>
                <span class="site-state-item-name">标签</span>
              </a>
            </div>
          

        </nav>

        
          <div class="feed-link motion-element">
            <a href="/atom.xml" rel="alternate">
              <i class="fa fa-rss"></i>
              RSS
            </a>
          </div>
        

        <div class="links-of-author motion-element">
          
            
              <span class="links-of-author-item">
                <a href="https://github.com/EZLippi" target="_blank">
                  
                    <i class="fa fa-github"></i> GitHub
                  
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="http://weibo.com/ouyanglip" target="_blank">
                  
                    <i class="fa fa-weibo"></i> weibo
                  
                </a>
              </span>
            
              <span class="links-of-author-item">
                <a href="http://www.zhihu.com/people/lippi-ouyang" target="_blank">
                  
                    <i class="fa fa-weibo"></i> zhihu
                  
                </a>
              </span>
            
          
        </div>

        
        

        <div class="links-of-author motion-element">
          
            <p class="site-author-name">友情链接</p>
            
              <span class="links-of-author-item">
                <a href="http://szhshp.org" target="_blank">szhshp的博客</a>
              </span>
            
              <span class="links-of-author-item">
                <a href="https://www.zhihu.com/people/lippi-ouyang" target="_blank">友链出租</a>
              </span>
            
          
        </div>

      </section>

      
        <section class="post-toc-wrap motion-element sidebar-panel sidebar-panel-active">
          <div class="post-toc-indicator-top post-toc-indicator">
            <i class="fa fa-angle-double-up"></i>
          </div>
          <div class="post-toc">
            
              
            
            
              <div class="post-toc-content"><ol class="nav"><li class="nav-item nav-level-2"><a class="nav-link" href="#Git与SVN差异"><span class="nav-number">1.</span> <span class="nav-text">Git与SVN差异</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Git常用命令"><span class="nav-number">2.</span> <span class="nav-text">Git常用命令</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#创建"><span class="nav-number">3.</span> <span class="nav-text">创建</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#本地修改"><span class="nav-number">4.</span> <span class="nav-text">本地修改</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#修改上次提交"><span class="nav-number">5.</span> <span class="nav-text">修改上次提交</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#搜索"><span class="nav-number">6.</span> <span class="nav-text">搜索</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#提交历史"><span class="nav-number">7.</span> <span class="nav-text">提交历史</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#分支与标签"><span class="nav-number">8.</span> <span class="nav-text">分支与标签</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#更新与发布"><span class="nav-number">9.</span> <span class="nav-text">更新与发布</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#合并与重置"><span class="nav-number">10.</span> <span class="nav-text">合并与重置</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#撤销"><span class="nav-number">11.</span> <span class="nav-text">撤销</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#Git进阶指南"><span class="nav-number">12.</span> <span class="nav-text">Git进阶指南</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：如何修改-origin-仓库信息？"><span class="nav-number">13.</span> <span class="nav-text">问：如何修改 origin 仓库信息？</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#1、添加-origin-仓库信息"><span class="nav-number">13.1.</span> <span class="nav-text">1、添加 origin 仓库信息</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2、查看-origin-仓库信息"><span class="nav-number">13.2.</span> <span class="nav-text">2、查看 origin 仓库信息</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3、删除-origin-仓库信息"><span class="nav-number">13.3.</span> <span class="nav-text">3、删除 origin 仓库信息</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：如何配置-git-ssh-keys-？"><span class="nav-number">14.</span> <span class="nav-text">问：如何配置 git ssh keys ？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：如何撤销修改？"><span class="nav-number">15.</span> <span class="nav-text">问：如何撤销修改？</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#1、新建的文件和目录，且从未提交至版本库"><span class="nav-number">15.1.</span> <span class="nav-text">1、新建的文件和目录，且从未提交至版本库</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2、提交过版本库，但未提交至暂存区的文件（未执行-git-add）"><span class="nav-number">15.2.</span> <span class="nav-text">2、提交过版本库，但未提交至暂存区的文件（未执行 git add）</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3、已提交至暂存区的文件"><span class="nav-number">15.3.</span> <span class="nav-text">3、已提交至暂存区的文件</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#4、已提交至版本库（执行了-git-commit）"><span class="nav-number">15.4.</span> <span class="nav-text">4、已提交至版本库（执行了 git commit）</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#5、如果回滚了之后又不想回滚了怎么办？"><span class="nav-number">15.5.</span> <span class="nav-text">5、如果回滚了之后又不想回滚了怎么办？</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：遇到冲突了怎么解决？"><span class="nav-number">16.</span> <span class="nav-text">问：遇到冲突了怎么解决？</span></a><ol class="nav-child"><li class="nav-item nav-level-3"><a class="nav-link" href="#1、最快的办法"><span class="nav-number">16.1.</span> <span class="nav-text">1、最快的办法</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#2、最通用的办法"><span class="nav-number">16.2.</span> <span class="nav-text">2、最通用的办法</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#3、最好的习惯"><span class="nav-number">16.3.</span> <span class="nav-text">3、最好的习惯</span></a></li><li class="nav-item nav-level-3"><a class="nav-link" href="#4、最复杂的情况"><span class="nav-number">16.4.</span> <span class="nav-text">4、最复杂的情况</span></a></li></ol></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：如何在不提交修改的前提下，执行-pull-merge-等操作？"><span class="nav-number">17.</span> <span class="nav-text">问：如何在不提交修改的前提下，执行 pull / merge 等操作？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：如何在-git-log-中查看修改的文件列表？"><span class="nav-number">18.</span> <span class="nav-text">问：如何在 git log 中查看修改的文件列表？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#问：git-submodule-update-时出错怎么解决？"><span class="nav-number">19.</span> <span class="nav-text">问：git submodule update 时出错怎么解决？</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#其他问题"><span class="nav-number">20.</span> <span class="nav-text">其他问题</span></a></li><li class="nav-item nav-level-2"><a class="nav-link" href="#参考资料"><span class="nav-number">21.</span> <span class="nav-text">参考资料</span></a></li></ol></div>
            
          </div>
          <div class="post-toc-indicator-bottom post-toc-indicator">
            <i class="fa fa-angle-double-down"></i>
          </div>
        </section>
      

    </div>
  </aside>


        
      </div>
    </main>

    <footer id="footer" class="footer">
      <div class="footer-inner">
        <div class="copyright" >
  
  &copy;  2014 - 
  <span itemprop="copyrightYear">2016</span>
  <span class="with-love">
    <i class="fa fa-heart"></i>
  </span>
  <span class="author" itemprop="copyrightHolder">EZLippi</span>
</div>

<div class="powered-by">
  由 <a class="theme-link" href="http://hexo.io">Hexo</a> 强力驱动
</div>

<div class="theme-info">
   托管在 -
  <a class="theme-link" href="https://github.com/EZLippi/EZLippi.github.io">
    Github
  </a>

</div>
<div class="theme-info">
<span id="busuanzi_container_site_pv">
    &nbsp; | &nbsp;本站总访问量<span id="busuanzi_value_site_pv"></span>次
</span>
</div>
<script async src="https://dn-lbstatics.qbox.me/busuanzi/2.3/busuanzi.pure.mini.js">
</script>



      </div>
    </footer>

    <div class="back-to-top"></div>
  </div>

  


  



  <script type="text/javascript" src="/vendors/jquery/index.js?v=2.1.3"></script>

  <script type="text/javascript" src="/vendors/fastclick/lib/fastclick.min.js?v=1.0.6"></script>

  <script type="text/javascript" src="/vendors/jquery_lazyload/jquery.lazyload.js?v=1.9.7"></script>

  <script type="text/javascript" src="/vendors/velocity/velocity.min.js"></script>

  <script type="text/javascript" src="/vendors/velocity/velocity.ui.min.js"></script>

  <script type="text/javascript" src="/vendors/fancybox/source/jquery.fancybox.pack.js"></script>


  


  <script type="text/javascript" src="/js/src/utils.js?v=0.5.0"></script>

  <script type="text/javascript" src="/js/src/motion.js?v=0.5.0"></script>



  
  

  
  
<script type="text/javascript" src="/js/src/scrollspy.js?v=0.5.0"></script>

<script type="text/javascript" id="sidebar.toc.highlight">
  $(document).ready(function () {
    var tocSelector = '.post-toc';
    var $tocSelector = $(tocSelector);
    var activeCurrentSelector = '.active-current';

    $tocSelector
      .on('activate.bs.scrollspy', function () {
        var $currentActiveElement = $(tocSelector + ' .active').last();

        removeCurrentActiveClass();
        $currentActiveElement.addClass('active-current');

        $tocSelector[0].scrollTop = $currentActiveElement.position().top;
      })
      .on('clear.bs.scrollspy', function () {
        removeCurrentActiveClass();
      });

    function removeCurrentActiveClass () {
      $(tocSelector + ' ' + activeCurrentSelector)
        .removeClass(activeCurrentSelector.substring(1));
    }

    function processTOC () {
      getTOCMaxHeight();
      toggleTOCOverflowIndicators();
    }

    function getTOCMaxHeight () {
      var height = $('.sidebar').height() -
                   $tocSelector.position().top -
                   $('.post-toc-indicator-bottom').height();

      $tocSelector.css('height', height);

      return height;
    }

    function toggleTOCOverflowIndicators () {
      tocOverflowIndicator(
        '.post-toc-indicator-top',
        $tocSelector.scrollTop() > 0 ? 'show' : 'hide'
      );

      tocOverflowIndicator(
        '.post-toc-indicator-bottom',
        $tocSelector.scrollTop() >= $tocSelector.find('ol').height() - $tocSelector.height() ? 'hide' : 'show'
      )
    }

    $(document).on('sidebar.motion.complete', function () {
      processTOC();
    });

    $('body').scrollspy({ target: tocSelector });
    $(window).on('resize', function () {
      if ( $('.sidebar').hasClass('sidebar-active') ) {
        processTOC();
      }
    });

    onScroll($tocSelector);

    function onScroll (element) {
      element.on('mousewheel DOMMouseScroll', function (event) {
          var oe = event.originalEvent;
          var delta = oe.wheelDelta || -oe.detail;

          this.scrollTop += ( delta < 0 ? 1 : -1 ) * 30;
          event.preventDefault();

          toggleTOCOverflowIndicators();
      });
    }

    function tocOverflowIndicator (indicator, action) {
      var $indicator = $(indicator);
      var opacity = action === 'show' ? 1 : 0;
      $indicator.velocity ?
        $indicator.velocity('stop').velocity({
          opacity: opacity
        }, { duration: 100 }) :
        $indicator.stop().animate({
          opacity: opacity
        }, 100);
    }

  });
</script>

<script type="text/javascript" id="sidebar.nav">
  $(document).ready(function () {
    var html = $('html');
    var TAB_ANIMATE_DURATION = 200;
    var hasVelocity = $.isFunction(html.velocity);

    $('.sidebar-nav li').on('click', function () {
      var item = $(this);
      var activeTabClassName = 'sidebar-nav-active';
      var activePanelClassName = 'sidebar-panel-active';
      if (item.hasClass(activeTabClassName)) {
        return;
      }

      var currentTarget = $('.' + activePanelClassName);
      var target = $('.' + item.data('target'));

      hasVelocity ?
        currentTarget.velocity('transition.slideUpOut', TAB_ANIMATE_DURATION, function () {
          target
            .velocity('stop')
            .velocity('transition.slideDownIn', TAB_ANIMATE_DURATION)
            .addClass(activePanelClassName);
        }) :
        currentTarget.animate({ opacity: 0 }, TAB_ANIMATE_DURATION, function () {
          currentTarget.hide();
          target
            .stop()
            .css({'opacity': 0, 'display': 'block'})
            .animate({ opacity: 1 }, TAB_ANIMATE_DURATION, function () {
              currentTarget.removeClass(activePanelClassName);
              target.addClass(activePanelClassName);
            });
        });

      item.siblings().removeClass(activeTabClassName);
      item.addClass(activeTabClassName);
    });

    $('.post-toc a').on('click', function (e) {
      e.preventDefault();
      var targetSelector = NexT.utils.escapeSelector(this.getAttribute('href'));
      var offset = $(targetSelector).offset().top;
      hasVelocity ?
        html.velocity('stop').velocity('scroll', {
          offset: offset  + 'px',
          mobileHA: false
        }) :
        $('html, body').stop().animate({
          scrollTop: offset
        }, 500);
    });

    // Expand sidebar on post detail page by default, when post has a toc.
    NexT.motion.middleWares.sidebar = function () {
      var $tocContent = $('.post-toc-content');

      if (CONFIG.sidebar.display === 'post' || CONFIG.sidebar.display === 'always') {
        if ($tocContent.length > 0 && $tocContent.html().trim().length > 0) {
          NexT.utils.displaySidebar();
        }
      }
    };
  });
</script>



  


  <script type="text/javascript" src="/js/src/bootstrap.js?v=0.5.0"></script>



  

  
    
  

  <script type="text/javascript">
    var duoshuoQuery = {short_name:"ezlippi"};
    (function() {
      var ds = document.createElement('script');
      ds.type = 'text/javascript';ds.async = true;
      ds.id = 'duoshuo-script';
      ds.src = (document.location.protocol == 'https:' ? 'https:' : 'http:') + '//static.duoshuo.com/embed.js';
      ds.charset = 'UTF-8';
      (document.getElementsByTagName('head')[0]
      || document.getElementsByTagName('body')[0]).appendChild(ds);
    })();
  </script>

  
    
  





  
  

  
  


</body>
</html>
